package com.huimin.merchant.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huimin.merchant.convert.AppConvert;
import com.huimin.merchant.dto.AppDTO;
import com.huimin.merchant.entity.App;
import com.huimin.merchant.entity.Merchant;
import com.huimin.merchant.mapper.AppMapper;
import com.huimin.merchant.mapper.MerchantMapper;
import com.huiminpay.common.cache.domain.BusinessException;
import com.huiminpay.common.cache.domain.CommonErrorCode;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.UUID;

/**
 * 应用服务接口
 *
 * @author amx
 * @date 2020/12/3 16:04
 */
@Service
@Component
public class AppServiceImpl implements AppServiceApi {

	@Autowired
	private AppMapper appMapper;

	@Autowired
	private MerchantMapper merchantMapper;


	/**
	 * 新增应用
	 *
	 * @param appDTO appDTO
	 * @return appDTO
	 */
	@Override
	public AppDTO createApp(AppDTO appDTO) {
		// 空值判断
		if (appDTO == null
				|| StringUtils.isEmpty(appDTO.getMerchantId())
				|| StringUtils.isEmpty(appDTO.getAppName())) {
			throw new BusinessException(CommonErrorCode.E_200202);
		}

		// 商户资质判断
		// 根据商户id获取商户信息
		Merchant merchantDb = merchantMapper.selectById(appDTO.getMerchantId());
		// 2代表拥有资质
		if (!"2".equals(merchantDb.getAuditStatus())) {
			throw new BusinessException(CommonErrorCode.E_200236);
		}


		App app = null;

		//根据商户id和应用名称获取应用信息
		App appDb = appMapper.selectOne(Wrappers.lambdaQuery(app)
		                                        .eq(App::getAppName, appDTO.getAppName())
		                                        .eq(App::getMerchantId, appDTO.getMerchantId()));

		// 若查得无此应用，则将appDTO里的app添加至数据库
		if (appDb == null) {

			// dto → entity
			app = AppConvert.INSTANCE.dto2entity(appDTO);
			// 设置appId
			String appId = UUID.randomUUID().toString();
			app.setAppId(appId);

			// 持久层操作：为表添加数据
			appMapper.insert(app);

			// 重设appDTO的id和appId
			// appDTO.setAppId(appId);
			// appDTO.setId(app.getId());
		}


		return appDTO;
	}

	/**
	 * 根据商户Id获取应用列表(获取商户应用信息)
	 *
	 * @param merchantId merchantId
	 * @return List<AppDTO>
	 */
	@Override
	public List<AppDTO> findAppsByMerchantId(Long merchantId) {

		// 根据id查询出app列表
		List<App> apps = appMapper.selectList(new LambdaQueryWrapper<App>().eq(App::getMerchantId, merchantId));

		// 将app列表转换为dto列表
		return AppConvert.INSTANCE.listentity2dto(apps);
	}

	/**
	 * 通过appId获取app对象
	 *
	 * @param appId appId
	 * @return AppDTO
	 */
	@Override
	public AppDTO findAppById(Long appId) {
		App app = appMapper.selectById(appId);

		return AppConvert.INSTANCE.entity2dto(app);
	}
}
